#ifndef NVS_HASHMAP_H
#define NVS_HASHMAP_H

#ifdef __cplusplus
extern "C" {
#endif

#include "nvs_flash.h"
#include "nvs.h"
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include "esp_event.h"

#define MAX_KEY_LENGTH 32
#define MAX_STRING_LENGTH 256
#define NVS_NAMESPACE "hashmap"

/** IP event declarations */
typedef enum {
    HM_EVENT_SSID_PASSWORD,               /*!< station got IP from connected AP */
    HM_EVENT_SSID_PASSWORD_NULL,               /*!< station got IP from connected AP */
} hmap_event_t;

typedef struct nvs_ssid_pass
{
    char ssid[64];
    char pass[64];
} nvs_ssid_pass_t;

/** @brief IP event base declaration */
ESP_EVENT_DECLARE_BASE(HMap_EVENT);

/**
 * 初始化NVS和HashMap
 * @return 成功返回ESP_OK，失败返回错误代码
 */
esp_err_t nvs_hashmap_init(void);

/**
 * 向HashMap中存储int类型值
 * @param key 键
 * @param value int值
 * @return 成功返回ESP_OK，失败返回错误代码
 */
esp_err_t nvs_hashmap_put_int(const char *key, int value);

/**
 * 向HashMap中存储string类型值
 * @param key 键
 * @param value 字符串值
 * @return 成功返回ESP_OK，失败返回错误代码
 */
esp_err_t nvs_hashmap_put_string(const char *key, const char *value);

/**
 * 从HashMap中获取int类型值
 * @param key 键
 * @param value 存储结果的指针
 * @return 成功返回ESP_OK，未找到返回ESP_ERR_NOT_FOUND，失败返回错误代码
 */
esp_err_t nvs_hashmap_get_int(const char *key, int *value);

/**
 * 从HashMap中获取string类型值
 * @param key 键
 * @param value 存储结果的缓冲区
 * @param max_length 缓冲区最大长度
 * @return 成功返回ESP_OK，未找到返回ESP_ERR_NOT_FOUND，失败返回错误代码
 */
esp_err_t nvs_hashmap_get_string(const char *key, char *value, size_t max_length);

/**
 * 从HashMap中删除键值对
 * @param key 键
 * @return 成功返回ESP_OK，未找到返回ESP_ERR_NOT_FOUND，失败返回错误代码
 */
esp_err_t nvs_hashmap_delete(const char *key);

/**
 * 清空HashMap
 * @return 成功返回ESP_OK，失败返回错误代码
 */
esp_err_t nvs_hashmap_clear(void);

/**
 * 检查键是否存在
 * @param key 键
 * @param exists 存储结果的指针（true存在，false不存在）
 * @return 成功返回ESP_OK，失败返回错误代码
 */
esp_err_t nvs_hashmap_key_exists(const char *key, bool *exists);

#ifdef __cplusplus
}
#endif

#endif // NVS_HASHMAP_H  